// DAO/Impl/EnrollDaoImpl.java
package com.hp.DAO.Impl;                         // 实现类所在包：DAO.Impl

import com.hp.DAO.BaseDao;                       // 继承 BaseDao 复用通用 JDBC 封装
import com.hp.DAO.EnrollDao;                     // 实现的接口：EnrollDao
import com.hp.Model.Enroll;                      // 领域实体：Enroll（选课）
import com.hp.Util.RowMapper;                    // 行映射器：ResultSet -> Enroll
import com.hp.Util.SimpleJdbcTemplate;           // JDBC 模板

import java.sql.Timestamp;                // 用于 Date <-> Timestamp 转换
import java.util.Date;                    // 统一使用 java.util.Date
import java.util.List;                    // List 集合

/** EnrollDao 的 JDBC 实现 */
public class EnrollDaoImpl extends BaseDao implements EnrollDao { // 继承并实现接口
    public EnrollDaoImpl(SimpleJdbcTemplate jdbc) { super(jdbc); } // 构造注入 JDBC 模板

    // RowMapper：ResultSet -> Enroll
    private static final RowMapper<Enroll> M = rs -> {
        Enroll e = new Enroll();                                  // 创建实体对象
        e.setId(rs.getLong("id"));                                 // id
        e.setCourseId(rs.getLong("course_id"));                    // 课程ID
        e.setUserId(rs.getLong("user_id"));                        // 用户ID
        e.setStatus(rs.getString("status"));                       // 选课状态
        Timestamp ts = rs.getTimestamp("enrolled_at");             // 选课时间
        e.setEnrolledAt(ts == null ? null : new Date(ts.getTime())); // 转 Date
        return e;                                                  // 返回映射结果
    };

    @Override
    public Enroll findById(Long id) {                              // 按主键查询
        String sql = "SELECT id,course_id,user_id,status,enrolled_at FROM enroll WHERE id=?"; // SQL
        return queryOne(sql, M, id);                               // 执行并返回
    }

    @Override
    public Enroll findByCourseAndUser(Long courseId, Long userId) {// 按课程+用户唯一查询
        String sql = "SELECT id,course_id,user_id,status,enrolled_at FROM enroll WHERE course_id=? AND user_id=?"; // SQL
        return queryOne(sql, M, courseId, userId);                 // 执行查询
    }

    @Override
    public List<Enroll> listByCourse(Long courseId, int offset, int limit) { // 按课程分页查询
        String sql = "SELECT id,course_id,user_id,status,enrolled_at FROM enroll " +
                "WHERE course_id=? ORDER BY id DESC LIMIT ? OFFSET ?"; // SQL
        return queryList(sql, M, courseId, limit, offset);          // 执行列表查询
    }

    @Override
    public Long insert(Enroll e) {                                  // 新增选课
        String sql = "INSERT INTO enroll (course_id,user_id,status,enrolled_at) VALUES (?,?,?,?)"; // SQL
        Date dt = e.getEnrolledAt() == null ? new Date() : e.getEnrolledAt(); // 默认当前时间
        return execInsertReturnId(sql,                              // 执行插入并返回主键
                e.getCourseId(), e.getUserId(), e.getStatus(),
                new Timestamp(dt.getTime()));
    }

    @Override
    public int updateStatus(Long id, String status) {               // 更新选课状态
        String sql = "UPDATE enroll SET status=? WHERE id=?";       // SQL
        return execUpdate(sql, status, id);                         // 执行更新
    }

    @Override
    public int deleteById(Long id) {                                // 删除选课
        String sql = "DELETE FROM enroll WHERE id=?";               // SQL
        return execUpdate(sql, id);                                 // 执行删除
    }
}
